package com.sy.handle;

import com.sy.pojo.RpcRequest;
import com.sy.util.SpringContextUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.lang.reflect.Method;

/**
 * 自定义的业务处理器
 */
public class UserServiceHandler extends ChannelInboundHandlerAdapter {

    // 当客户端读取数据时，该方法会被调用
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 注意: 客户端将来发送请求的时候会传递一个 RpcRequest 对象，强转处理
        RpcRequest rpcRequest = (RpcRequest) msg;
        // 获取容器中的 bean
        String className = rpcRequest.getClassName().substring(rpcRequest.getClassName().lastIndexOf(".") + 1);
        Object object = SpringContextUtil.getBean(className);
        // 获取客户端调用的方法
        Method method = object.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParameterTypes());
        // 调用实现类获得一个 result
        Object result = method.invoke(object, rpcRequest.getParameters());
        // 将 result 写到客户端
        ctx.writeAndFlush(result);
    }
}
